home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / 80x0393.zip / DRAWCHAR.ASM < prev    next >
Assembly Source File  |  1992-07-30  |  7KB  |  193 lines

  1. ;
  2. ;  DRAWCHAR.ASM
  3. ;
  4. ;  Author: Matt Pritchard
  5. ;  Released to public domain
  6. ;
  7. ;Assumes Character set of 128 x 8 Bytes 
  8. ;  Character Set has a 16 byte Scratch Buffer at end.... 
  9. ;GPRINTC (CharSet, CharNum, Xpos, Ypos, ColorF, ColorB) 
  10. ; in "C"
  11. ;void GPRINTC(far char* SetData, int CharNum, int Xpos, 
  12. ;              int Ypos, int Color_Fg, int Color_Bg) 
  13. ; in "BASIC" 
  14. ;TYPE CharSET 
  15. ;    BitMaps AS STRING * 1024 
  16. ;    Scratch AS STRING * 16 ;END TYPE 
  17. ;DIM SetData AS CharSET 
  18. ;DECLARE SUB GPRINTC(SEG SetData AS ANY, BYVAL CharNum%, BYVAL Xpos%,_ 
  19. ;                    BYVAL Ypos%, BYVAL ColorF%, BYVAL ColorB%) 
  20. ;Draws Text Character (8x8) in Graphics Mode 13 at Pixel (Xpos,Ypos) 
  21. ;In Color: COLORF with background of COLORB 
  22. ;
  23.  
  24.         .MODEL  Medium
  25.         .CODE
  26.  
  27. SCRATCH_OFS     EQU     1024+2  ;Character Set Working Area Offset 
  28. VGA_SEGMENT     EQU     0A000H  ;Vga Memory Segment 
  29. SCREEN_WIDTH    EQU     320     ;Width of screen in Pixels/Bytes
  30.  
  31. GPC_STACK       STRUC
  32.                         DW      ?       ;DI
  33.                         DW      ?       ;SI
  34.                         DW      ?       ;DS
  35.                         DW      ?       ;BP
  36.                         DD      ?       ;Caller
  37.         GPC_COLORB      DB      ?,?     ;Background Color
  38.         GPC_COLORF      DB      ?,?     ;Forground Color
  39.         GPC_YPOS        DW      ?       ;Y position
  40.         GPC_XPOS        DW      ?       ;X position
  41.         GPC_CHAR_NUM    DB      ?,?     ;Character #
  42.         GPC_SET_OFS     DW      ?       ;Offset of Set Data
  43.         GPC_SET_SEG     DW      ?       ;Segment of Set Data GPC_STACK
  44. ENDS
  45.  
  46.         PUBLIC GPRINTC
  47.  
  48. GPRINTC         PROC    FAR
  49.  
  50.         PUSH    BP
  51.         PUSH    DS                      ;Save Data Seg
  52.         PUSH    SI                      ;BC7 - Save Si,DI, Dir Flag
  53.         PUSH    DI
  54.  
  55.         MOV     BP,SP                   ;Set to address of bp
  56.  
  57.  
  58.         ;Compute Screen Addr to Write to in ES:DI
  59.  
  60.         MOV     AX,[BP].GPC_YPOS        ;Get Value of Ypos (mult * 320)
  61.         MOV     DH,AL                   ;Save 256*Y
  62.         MOV     CL,6                    ;mult * 2^6 (Y * 64)
  63.         SHL     AX,CL                   ;Shift Left
  64.         ADD     AH,DH                   ;Add in 256 * Ypos
  65.  
  66.         ADD     AX,[BP].GPC_XPOS        ;Add X position to addr
  67.  
  68.         MOV     DI,AX                   ;Save in DI
  69.  
  70.         ;Get Source ADDR of Character Bit Map in DS:SI
  71.         ;But first, save colors in lookup table
  72.  
  73.  
  74.         MOV     BX,[BP].GPC_SET_OFS     ;Get OFFSET of Character Set
  75.         MOV     SI,BX                   ;Save in SI for now..
  76.  
  77.         ;Get colors
  78.  
  79.         MOV     AX,[BP].GPC_SET_SEG     ;Segment of Charset
  80.         MOV     ES,AX                   ;Use ES to point to it...
  81.  
  82.         MOV     AL,[BP].GPC_COLORB      ;Get Backgorund color
  83.         MOV     ES:[SI+SCRATCH_OFS],AL  ;Save in Table at Pos (0)
  84.  
  85.         MOV     AL,[BP].GPC_COLORF      ;Forground Color (1)
  86.         MOV     ES:[SI+SCRATCH_OFS+1],AL   ;Save in Table
  87.  
  88.         ;Get addr of character map
  89.  
  90.         MOV     AL,[BP].GPC_CHAR_NUM    ;Get Character #
  91.         AND     AX,007FH                ;Valid #'s are 0..127
  92.         SHL     AX,1                    ;* 2
  93.         SHL     AX,1                    ;* 4
  94.         SHL     AX,1                    ;* 8
  95.  
  96.         MOV     BX,SI                   ;BX = Start of Char Set
  97.         ADD     BX,SCRATCH_OFS          ;BX points to lookup table
  98.  
  99.         ADD     SI,AX                   ;Add Start of Character Set
  100.  
  101.         ;Get segment of character map
  102.  
  103.         MOV     DS,[BP].GPC_SET_SEG     ;Get Segment of Character Set
  104.                                         ;Cant use DS (DGROUP) anymore
  105.  
  106.         MOV     AX,VGA_SEGMENT          ;VGA Graphics Segment
  107.         MOV     ES,AX
  108.         CLD                             ;Forwards....
  109.  
  110.         MOV     CX,8                    ;8 Bytes to Decode
  111.  
  112. DECODE_CHAR_BYTE:
  113.  
  114.         LODSB                           ;Get Byte to decode in DS:SI
  115.         MOV     DL,AL                   ;Save in DL
  116.  
  117.         XOR     DH,DH                   ;Clear DH
  118.         SHL     DX,1                    ;Get Bit #1
  119.         MOV     AL,DH                   ;Put in AL
  120.         XLAT    AL                      ;Translate into DAC value
  121.  
  122.         STOSB                           ;Write to Video Buffer
  123.  
  124.         XOR     DH,DH                   ;Clear DH
  125.         SHL     DX,1                    ;Get Bit #2
  126.         MOV     AL,DH                   ;put in AL
  127.         XLAT    AL                      ;Translate into DAC value
  128.  
  129.         STOSB                           ;Write to Video Buffer
  130.  
  131.         XOR     DH,DH                   ;Clear DH
  132.         SHL     DX,1                    ;Get Bit #3
  133.         MOV     AL,DH                   ;put in AL
  134.         XLAT    AL                      ;Translate into DAC value
  135.  
  136.         STOSB                           ;Write to Video Buffer
  137.  
  138.         XOR     DH,DH                   ;Clear DH
  139.         SHL     DX,1                    ;Get Bit #4
  140.         MOV     AL,DH                   ;put in AL
  141.         XLAT    AL                      ;Translate into DAC value
  142.  
  143.         STOSB                           ;Write to Video Buffer
  144.  
  145.         XOR     DH,DH                   ;Clear DH
  146.         SHL     DX,1                    ;Get Bit #5
  147.         MOV     AL,DH                   ;put in AL
  148.         XLAT    AL                      ;Translate into DAC value
  149.  
  150.         STOSB                           ;Write to Video Buffer
  151.  
  152.         XOR     DH,DH                   ;Clear DH
  153.         SHL     DX,1                    ;Get Bit #6
  154.         MOV     AL,DH                   ;put in AL
  155.         XLAT    AL                      ;Translate into DAC value
  156.  
  157.         STOSB                           ;Write to Video Buffer
  158.  
  159.         XOR     DH,DH                   ;Clear DH
  160.         SHL     DX,1                    ;Get Bit #7
  161.         MOV     AL,DH                   ;put in AL
  162.         XLAT    AL                      ;Translate into DAC value
  163.  
  164.         STOSB                           ;Write to Video Buffer
  165.  
  166.         XOR     DH,DH                   ;Clear DH
  167.         SHL     DX,1                    ;Get Bit #8
  168.         MOV     AL,DH                   ;put in AL
  169.         XLAT    AL                      ;Translate into DAC value
  170.  
  171.         STOSB                           ;Write to Video Buffer
  172.  
  173.         ADD     DI,SCREEN_WIDTH-8       ;Point to Next Line
  174.  
  175.         LOOP    DECODE_CHAR_BYTE        ;Process all Lines
  176.  
  177.         POP     DI
  178.         POP     SI
  179.         POP     DS                      ;Restore Data Segment
  180.         POP     BP                      ;Restore Bp
  181.  
  182.         RET     14                      ;Exit and Clean up Stack
  183.  
  184.  
  185. GPRINTC  ENDP
  186.